/*
 *  Copyright (C) void Team 2010 Pedro Batista
 * 
 *  http://code.google.com/p/capacitec
 * 
 *  This file is part of capacitec.
 * 
 *  capacitec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  capacitec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with capacitec.  If not, see <http://www.gnu.org/licenses/>.
 */
package controller;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import dao.AlunoSubProgramaDao;
import dao.SubProgramaDao;
import entidades.AlunoSubPrograma;
import java.util.LinkedList;
import seguranca.anotacoes.RestritoCoordenador;
import util.AvaliaResources;

/**
 * Calsse responsável por métodos de avaliação das inscrições em subprogramas.
 * @author pedro
 */
@Resource
public class AvaliaController {

	private final AvaliaResources avaliaResources;
	private final AlunoSubProgramaDao alunoSubProgramaDao;
	private final SubProgramaDao subProgramaDao;
	private final Result resul;

	/**
	 *
	 * @param avaliaResources
	 * @param alunoSubProgramaDao
	 * @param subProgramaDao
	 * @param resul
	 */
	public AvaliaController(AvaliaResources avaliaResources, AlunoSubProgramaDao alunoSubProgramaDao, SubProgramaDao subProgramaDao, Result resul) {
		this.avaliaResources = avaliaResources;
		this.alunoSubProgramaDao = alunoSubProgramaDao;
		this.subProgramaDao = subProgramaDao;
		this.resul = resul;
	}

	/**
	 * Avalia o próximo aluno da lista de alunos atualmente sendo
	 * avaliada.
	 * @return Cadastro a ser avaliado.
	 */
	@Get
	@Path("/avalia")
	@RestritoCoordenador
	public AlunoSubPrograma avalia() {
		//TODO: adicionar mais campos para visualizar melhor o aluno e do subprograma.
		//TODO: mostrar campo com o nome do subprograma proposto pelo candidato.
		//TODO: fechar para que apenas o coordenador deste programa possa fazer a avaliação.
		//Para isso talvez seja necessário criar outra marcação (RestritoCoordenadorSubPrograma)
		//e bloquear a requisição caso seja necessário na autorização interceptor.
		AlunoSubPrograma atual = avaliaResources.getAlunoSubPrograma().peek();
		if (atual == null) {
			resul.redirectTo(HomeController.class).index();
		}
		return atual;
	}

	/**
	 * Constroi a lista de alunos para ser avaliada baseado em um subprograma.
	 * @param subProgramaId id so subprograma que será avaliado.
	 */
	@Post
	@Path("/avalia_subprograma/{subProgramaId}")
	@RestritoCoordenador
	public void avaliaSubPrograma(Integer subProgramaId) {
		//TODO: verficar para listar somente os ainda não verificados.
		avaliaResources.setAlunoSubPrograma(new LinkedList<AlunoSubPrograma>(subProgramaDao.carrega(subProgramaId).getAlunoSubProgramaList()));
		resul.redirectTo(AvaliaController.class).avalia();
	}

	/**
	 * Atualiza a situação do aluno na cabeça da fila.
	 * @param situacao situação que será adicionada.
	 */
	@Post
	@Path("/avalia/{situacao}")
	@RestritoCoordenador
	public void avalia(String situacao) throws Exception {
		//TODO: WARNING é importante notar que se existires duas páginas abertas
		//e uma delas avançar na fila e a outra ficar atrasada e se clique
		//na página atrasada o aluno avaliado seŕa o da página adiantada
		//e não o que se está vendo que é o da atrasada.
		//Para se solucionar isso deve-se passar como argumento não somente
		//a situação mas toda a classe.
		//TODO: Required tratar para que só se deixe vincular os alunos para os quais existem vagas.
		AlunoSubPrograma atual = avaliaResources.getAlunoSubPrograma().poll();
		atual.setSituacao(situacao);
		if (situacao.equals("vinculado")) {
			//TODO: tratar essa execessão
			subProgramaDao.matricula(atual);
		} else if (situacao.equals("rejeitado")) {
			subProgramaDao.desvincula(atual);
		}
		alunoSubProgramaDao.salva(atual);
		resul.redirectTo(AvaliaController.class).avalia();
	}

	/**
	 * Avança para o próximo aluno da lista. E coloca o aluno atual (cabeça)
	 * no final da fila.
	 */
	@Path("/avalia/proximo")
	@RestritoCoordenador
	public void proximo() {
		avaliaResources.getAlunoSubPrograma().add(avaliaResources.getAlunoSubPrograma().poll());
		resul.redirectTo(AvaliaController.class).avalia();
	}
}
